<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>

        // 深拷贝 
        const o1 = {
            name:'peter',
            age:18,
            info:{
                weight:'100kg',
                height:'181cm'
            },
            address:{
                city:'济南',
                desc:{
                    infos:'历山路利宝大厦'
                }
            },
            hobby:[
                '蓝球','足球','乒乓球',[66,77,88]
            ]
        }

        // 上面的数据结构 复制一份一模一样 每一层都是独立的堆内存地址    
        // 这就是深拷贝  

        // 手动封装 深拷贝的方法    


        // 递归  自己调用自己  

        // function deep_copy(target,origin){
        //     // target 最终的目标
        //     // origin 原始的数组 
        //     // 把origin的内容拷贝到 target 一份 

        //     // 如何判定这个数据是对象  如何判定这个数据是数组 
        //     // typeof  instanceof constructor hasOwnProtoperty
        //     // Object.prototype.toString.call() 
        //     // 这里选择constructor 判断是否是从Array Object 构造函数出来 


        // }


        function deep_copy(target,origin){
            // 遍历origin  
            for(let k in origin){
                // 判断 origin[k] 是不是数组或者对象 
                // 如果不是直接复制到新对象中 

                // 如果是  调用自己重新遍历复制 

                if(origin[k].constructor === Object){
                    // 创建一个新对象 
                    target[k] = {};
                    deep_copy(target[k],origin[k])
                }
                else if(origin[k].constructor === Array){
                    target[k] = [];
                    deep_copy(target[k],origin[k])
                }
                else{
                    target[k] = origin[k] 
                }


            }
            return target
        }


        const o2 = {};
        deep_copy(o2,o1);

        console.log(o2,o1);


        // // 修改第一层的数据  
        // o2.name = 'jack';
        // console.log(o2,o1);


        // // 修改第2层的数据  
        // o2.info.weight = '200kg';
        // console.log(o2,o1);


        // 修改第3层的数据  
        // o2.address.desc.infos = '洪家楼';
        // console.log(o2,o1);
        // o2.hobby[3][1] = 99;
        // console.log(o2,o1);
    </script>
</body>
</html>